#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
基于LL(1)分析表的非递归语法分析器

这个模块实现了一个基于栈的非递归LL(1)语法分析器，用于分析简单表达式文法。
与递归下降分析不同，此实现使用显式栈和预测分析表来进行非递归的语法分析。

本实现处理的文法如下（与rec.py相同）：
E  → T E'       # 表达式
E' → + T E' | ε # 表达式后缀（处理加法）
T  → F T'       # 项
T' → * F T' | ε # 项后缀（处理乘法）
F  → ( E ) | i  # 因子（括号表达式或标识符）
"""

def tokenize(input_string):
    """
    将输入字符串转换为标记列表。
    
    参数:
        input_string: 输入的字符串
        
    返回:
        标记列表，每个标记是终结符或结束符
    """
    tokens = []
    i = 0
    while i < len(input_string):
        # 跳过空格
        if input_string[i].isspace():
            i += 1
            continue
        # 识别标识符 'i'（根据rec.py的文法）
        elif input_string[i] == 'i':
            tokens.append('i')
            i += 1
        # 识别运算符和括号
        elif input_string[i] in '()+-*#':
            tokens.append(input_string[i])
            i += 1
        else:
            # 未知字符，直接作为标记加入
            tokens.append(input_string[i])
            i += 1
    return tokens

def ll1_parser(input_string):
    """
    基于LL(1)分析表的非递归语法分析器。
    
    参数:
        input_string: 待分析的输入字符串，需要以'#'结尾
        
    返回:
        "syntax correct": 如果输入字符串符合文法规则
        "syntax error": 如果输入字符串不符合文法规则
    """
    # LL(1)预测分析表
    # 键：(非终结符, 终结符)，值：产生式右部列表
    # 对应文法: E→TE', E'→+TE'|ε, T→FT', T'→*FT'|ε, F→(E)|i
    parsing_table = {
        ('E', '('): ['T', "E'"],
        ('E', 'i'): ['T', "E'"],
        ("E'", '+'): ['+', 'T', "E'"],
        ("E'", ')'): ['ε'],  # ε表示空产生式
        ("E'", '#'): ['ε'],  # ε表示空产生式
        ('T', '('): ['F', "T'"],
        ('T', 'i'): ['F', "T'"],
        ("T'", '+'): ['ε'],  # ε表示空产生式
        ("T'", '*'): ['*', 'F', "T'"],
        ("T'", ')'): ['ε'],  # ε表示空产生式
        ("T'", '#'): ['ε'],  # ε表示空产生式
        ('F', '('): ['(', 'E', ')'],
        ('F', 'i'): ['i']
    }
    
    # 初始化分析栈
    stack = ['#', 'E']  # 栈底是结束符#，然后是开始符号E
    
    # 分词处理
    input_tokens = tokenize(input_string)
    ptr = 0  # 输入指针
    
    try:
        # 当栈不为空时继续分析
        while stack:
            # 获取栈顶符号
            top = stack[-1]
            # 获取当前输入符号
            current_token = input_tokens[ptr] if ptr < len(input_tokens) else ''
            
            # 情况1: 栈顶符号和当前输入符号都是#，分析成功
            if top == '#' and current_token == '#':
                return "syntax correct"
                
            # 情况2: 栈顶符号是终结符
            elif top in ['i', '+', '*', '(', ')', '#']:
                # 如果栈顶终结符与当前输入符号匹配
                if top == current_token:
                    stack.pop()  # 弹出栈顶终结符
                    ptr += 1     # 移动输入指针到下一个符号
                else:
                    # 终结符不匹配，语法错误
                    return "syntax error"
                    
            # 情况3: 栈顶符号是非终结符
            elif top in ['E', "E'", 'T', "T'", 'F']:
                # 查找预测分析表
                key = (top, current_token)
                if key in parsing_table:
                    # 获取产生式右部
                    production = parsing_table[key]
                    # 弹出栈顶非终结符
                    stack.pop()
                    # 将产生式右部逆序压入栈中（跳过ε）
                    for symbol in reversed(production):
                        if symbol != 'ε':  # 跳过空产生式
                            stack.append(symbol)
                else:
                    # 分析表中没有对应的产生式，语法错误
                    return "syntax error"
            else:
                # 未知符号，语法错误
                return "syntax error"
        
        # 如果栈为空但输入未处理完，也是语法错误
        return "syntax error"
        
    except (IndexError, KeyError):
        # 捕获可能的异常，返回语法错误
        return "syntax error"

import sys
# 测试示例
# --- 主程序逻辑 ---
if __name__ == "__main__":
    # sys.stdin 可以逐行读取，直到EOF
    for line in sys.stdin:
        result = ll1_parser(line)
        print(result)